/* Die Klasse Buchsuchen implementiert alle suchemoeglichkeit , 
 * die man fuer die einer Buch braucht
 * 
 * 
 * Datei: Buchsuchen.java       
 * Autor: Gregory Keussi
 * 
 * Datum: 16.11.11                 Version: 0.1 
 * 
 * Historie: 12.11.11 v0.1  
 *                    implementiert  
 * 
 */

package suche;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import medienverwaltung.Buch;
import medienverwaltung.Medium;
import personenverwaltung.Person;

public class Buchsuchen implements SuperString<Medium>
{
  private List<Buch> myBuchList;
  private List<Buch> Ergebnis = new ArrayList<Buch> ();


  /*
   * Die Methode ermoeglich die suche eines Buch nach dem Titel
   */

  public List<Buch> suchBuchNachTitel (String titel)
  {

    for (Buch Buch : myBuchList)
    {
      System.out.println ("titre = " + Buch.gibTitel ());
      if (Buch.gibTitel ().equals (titel))
      {

        System.out.println (" in der if");
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode ermoeglich die suche eines Buch nach dem Thema
   */
  public List<Buch> suchBuchNachThema (String thema)
  {
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibTitel ().contains (thema)) == true)
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode ermoeglich die suche eines Buch nach der Stichwoerte
   * und liefert eine Liste von entsprechende Buchen zurueck,die Suche
   * Krietere entsprechen
   */

  public List<Buch> suchBuchNachStichworte (String stich)
  {
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibTitel ().contains (stich)) == true)
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode ermoeglich die suche eines Buch nach der Fachgebiet und
   * liefert eine Liste von entsprechende Buchen zurueck,die Suche
   * Krietere entsprechen
   */

  public List<Buch> suchBuchNachFachgebiet (String fach)
  {
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibTitel ().contains (fach)) == true)
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode ermoeglich die suche eines Buch nach der Initial und
   * liefert eine Liste von entsprechende Buchen zurueck,die Suche
   * Krietere entsprechen
   */

  public List<Buch> suchBuchNachInitial (String initial)
  {
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibTitel ().contains (initial)) == true)
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode ermoeglich die suche eines Buch nach der Sachgebiet und
   * liefert eine Liste von entsprechende Buchen zurueck,die Suche
   * Krietere entsprechen
   */

  public List<Buch> suchBuchNachSachgebiet (String sach)
  {
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibTitel ().contains (sach)) == true)
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode ermoeglich die suche eines Buch nach dem Datum und
   * liefert eine Liste von entsprechende Buchen zurueck,die Suche
   * Krietere entsprechen Die Methode soll auch pruefen, ob das
   * eingegebenen Datum groesser als die Erscheinungsjahr den Buchen ist
   */

  public List<Buch> suchBuchNachErschjahrKlein (String date)
  {
    int iDate = Integer.parseInt (date);
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibErscheinungsdatum ().gibJahr () < iDate))
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  public List<Buch> suchBuchNachSchlagworte (String schlag)
  {
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibStichworte ().contains (schlag)) == true)
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode ermoeglich die suche eines Buch nach dem Datum und
   * liefert eine Liste von entsprechende Buchen zurueck,die Suche
   * Krietere entsprechen Die Methode soll auch pruefen, ob das
   * eingegebenen Datum kleiner als die Erscheinungsjahr den Buchen ist
   */

  public List<Buch> suchBuchNachErschjahrGross (String date)
  {

    int iDate = Integer.parseInt (date);
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibErscheinungsdatum ().gibJahr () > iDate))
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode ermoeglich die suche eines Buch nach dem Datum und
   * liefert eine Liste von entsprechende Buchen zurueck,die Suche
   * Krietere entsprechen Die Methode soll auch pruefen, ob das
   * eingegebenen Datum gleich als die Erscheinungsjahr den Buchen ist
   */

  public List<Buch> suchBuchNachErschjahrGleich (String date)
  {

    int iDate = Integer.parseInt (date);
    for (Buch Buch : myBuchList)
    {
      if ( (Buch.gibErscheinungsdatum ().gibJahr () == iDate))
      {
        Ergebnis.add (Buch);
      }
    }

    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methoe ermoeglicht die Recherche von einer Buch nach seinem
   * Autor. Und liefert eine Liste von Buchen,die den Autor geschrieben
   * hat.
   */

  public List<Buch> suchBuchNachAutor (String autor)
  {
    for (Buch Buch : myBuchList)
    {

      for (Person aut : Buch.gibAutorenListe ())
      {
        if ( (aut.gibNachname ().contains (autor)) == true)
        {
          Ergebnis.add (Buch);
        }
      }
    }
    Collections.sort (Ergebnis, new CompareMedium ());
    return Ergebnis;
  }


  /*
   * Die Methode liefert eine Liste von allen Buch, die in der
   * Medienliste sind
   */
  public List<Buch> gibMyBuchList ()
  {
    return myBuchList;
  }


  /*
   * Die Methode ermoeglicht,dass man eine neue Liste von von Buch gibt
   */

  public void setzeMyBuchList (List<Buch> myBuchList)
  {
    this.myBuchList = myBuchList;
  }


  /*
   * Die methode liefert eine Liste zurueck. Durch diese Methode kann
   * man eine Liste von seiner gesuchten krietere bekommen
   */

  public List<Buch> gibErgebnis ()
  {
    return Ergebnis;
  }


  /*
   * Die Methode implementiert die Verwaltung von der Suche einer Buch.
   * und sie liefert nichts zurueck
   */

  public void BuchSuchVerwalter (int i, String s)
  {
    switch (i)
    {
    /*
     * Die case 0 ist die zuweisung der werte null an die Liste Ergebnis
     * ,
     */

    case 0:
      Ergebnis = null;
      break;

    /*
     * Die case 1 Die die zuweisung von der Werte null an die Liste
     * Ergebnis..
     */

    case 1:
      Ergebnis = null;
      ;
      break;

    /*
     * Die case 2 ist Aufruf der Methode ,die nach Erscheinungsdatum
     * gleich als das eingegeben Datum sucht
     */

    case 2:
      suchBuchNachErschjahrGleich (s);
      break;

    /*
     * Die case 3 ist Aufruf der Methode , die nach Erscheinungsdatum
     * Grosser als das eingegeben Datum sucht
     */

    case 3:
      suchBuchNachErschjahrGross (s);
      break;

    /*
     * Die case 4 ist Aufruf der Methode , die nach Erscheinungsdatum
     * kleiner als das eingegeben Datum sucht
     */

    case 4:
      suchBuchNachErschjahrKlein (s);
      break;

    /*
     * Die case 5 ist Aufruf der Methode , die nach Fachgebiet sucht
     */

    case 5:
      suchBuchNachFachgebiet (s);
      break;

    /*
     * Die case 6 ist Aufruf der Methode , die nach Initial sucht
     */

    case 6:
      suchBuchNachInitial (s);
      break;

    /*
     * Die case 7 ist Aufruf der Methode , die nach Sachgebiet sucht
     */

    case 7:
      suchBuchNachSachgebiet (s);
      break;

    /*
     * Die case 8 ist Aufruf der Methode , die nach Schlagworte sucht
     */

    case 8:
      suchBuchNachSchlagworte (s);
      break;

    /*
     * Die case 9 die zuweisung von der Werte null an die Liste
     * Ergebnis.
     */
    case 9:
      Ergebnis = null;
      break;

    /*
     * Die case 10 ist Aufruf der Methode , die nach Stichworte sucht
     */

    case 10:
      suchBuchNachStichworte (s);
      break;

    /*
     * Die case 11 ist Aufruf der Methode ,die nach Thema sucht
     */

    case 11:
      suchBuchNachThema (s);
      break;

    /*
     * Die case 12 ist Aufruf der Methode ,die nach Titel sucht
     */

    case 13:
      suchBuchNachTitel (s);
      break;

    default:
      break;

    }

  }


  /*
   * Die Methode liert ale basis informationen ueber ein Medium in einem
   * String .Die Methode nimmt ein Objekt Medium als parameter und gibt
   * ein String zurueck.
   */

  public String superString (Medium t)
  {
    String s = "\n ";
    s += "\nFach: ";
    s += t.gibFachgebiet ();
    s += " Sach: ";
    s += t.gibSachgebiet ();
    s += " \nThema: ";
    s += t.gibThema ();
    s += " Titel ";
    s += t.gibTitel ();
    s += " \nStichW: ";
    s += t.gibStichworteString ();
    s += " Erschnungsjahr: ";
    s += t.gibErscheinungsdatumString ();
    s += "\n Verlag: ";
    // s += t.gibVerlag ().gibName ();

    return s;
  }


  /*
   * Die Methode ErgebnisToString wandelt eine Liste von gefundenen Buch
   * in String um. und die Methode wird spaeter fuer die Gui verwendet.
   * Die Methode nimmt eine Liste von Objekten Buch .Und sie gibt ein
   * String zurueck.
   */
  public String ErgebnisToString (List<Buch> BuchL)
  {
    String a = " ";

    for (Buch Buch : BuchL)
    {
      a = "Buch:\n ";
      a += Buch.gibAutorenListeString ();
      a += superString (Buch);
    }
    return a;
  }

}
